package Linux五种IO模型;

import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author coderFu
 * @create 2022/3/5
 * 客户端接收处理器
 *
 * 在活动连接数不是特别高的（小于1000单机）的情况下
 * 可以使用多线程加BIO进行解决，让每一个链接专注于自己的IO
 * 但是当链接上万甚至百万的时候，需要一种更高效的IO处理来应对
 * 更高的并发量
 */
public class ClientHandler implements Runnable{
    // 注入客户端的socket ，处理客户端的业务

    private final Socket clientSocket;

    public ClientHandler(Socket clientSocket){
        this.clientSocket = clientSocket;
    }


    @Override
    public void run() {

        try(Scanner input = new Scanner(clientSocket.getInputStream())){
            while(true){
                // 读取客户端的信息
                System.out.println("处理的线程是："+Thread.currentThread().getName());
                System.out.println("链接来自："+clientSocket.getRemoteSocketAddress());
                String request = input.nextLine();
                if ("quit".equals(request)){
                    System.out.println("客户端断开连接，停止发送数据");
                    break;
                }

                byte[] buffer = new byte[1024];
                int len = -1;

                while ((len = clientSocket.getInputStream().read(buffer)) != -1){
                    String s = new String(buffer,0,len);
                    System.out.println(s);
                }
                System.out.println("传输的信息为："+request);
                String response = "886"+request;
                clientSocket.getOutputStream().write(response.getBytes());

            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
